import axios from 'axios'
import { showToast } from 'vant'

// 创建axios实例
const service = axios.create({
  baseURL: '/api', // 使用相对路径，由开发服务器代理处理
  timeout: 15000, // 请求超时时间
  withCredentials: true // 跨域请求是否需要携带cookie
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在请求发送前做一些处理，例如添加token
    const token = localStorage.getItem('token')
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  error => {
    // 处理请求错误
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 直接返回数据部分
    const res = response.data
    
    // 如果自定义状态码不是200，则处理错误但不抛出异常
    if (res.code !== 200) {
      showToast({
        message: res.message || '请求失败',
        type: 'fail',
        duration: 5000
      })
      
      // 处理特定错误，例如401未授权
      if (res.code === 401) {
        // 提示用户
        showToast({
          message: '请重新登录',
          type: 'warning',
          duration: 3000
        })
      }
    }
    
    // 无论成功失败都返回完整响应，让业务代码自行判断
    return res
  },
  error => {
    console.error('响应错误:', error)
    
    // 处理网络错误、超时等
    let message = '网络错误，请稍后重试'
    if (error.response) {
      // 尝试获取后端返回的错误信息
      if (error.response.data && error.response.data.message) {
        message = error.response.data.message;
      } else {
        switch (error.response.status) {
          case 400:
            message = '请求错误，请检查输入'
            break
          case 401:
            message = '未授权，请重新登录'
            // 不要自动清除token和跳转，将控制权交给业务代码
            break
          case 403:
            message = '拒绝访问，权限不足'
            break
          case 404:
            message = '请求地址不存在'
            break
          case 500:
            message = '服务器内部错误，请稍后重试'
            break
          default:
            message = `请求失败: ${error.response.status}`
        }
      }
    } else if (error.message && error.message.includes('timeout')) {
      message = '请求超时，请稍后重试'
    } else if (error.message && error.message.includes('Network Error')) {
      message = '网络连接失败，请检查网络设置'
    }
    
    showToast({
      message: message,
      type: 'fail',
      duration: 5000
    })
    
    // 为了方便业务代码处理，构造一个类似正常响应的错误对象
    const errorResponse = {
      code: error.response ? error.response.status : 500,
      message: message,
      data: null
    };
    
    // 返回构造的错误对象，而不是直接拒绝Promise
    return errorResponse;
  }
)

export default service 